package ar.uade.edu.fain.ad.server.dao.jpa;

import javax.persistence.PersistenceException;

import org.hibernate.Session;

import ar.uade.edu.fain.ad.server.business.ItemOrdenCompra;
import ar.uade.edu.fain.ad.server.business.OrdenCompra;
import ar.uade.edu.fain.ad.server.dao.OrdenCompraDAO;
import ar.uade.edu.fain.ad.server.dao.ProductoDAO;
import ar.uade.edu.fain.ad.server.dao.entity.ItemOrdenCompraEntity;
import ar.uade.edu.fain.ad.server.dao.entity.OrdenCompraEntity;

public class OrdenCompraJpaDAO extends
		GenericJpaDAO<OrdenCompra, OrdenCompraEntity, Long> implements
		OrdenCompraDAO {

	private ProductoDAO productoDAO;

	public OrdenCompraJpaDAO() {
		super(OrdenCompraEntity.class);
	}

	public ProductoDAO getProductoDAO() {
		return productoDAO;
	}

	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}

	@Override
	protected OrdenCompraEntity toEntity(OrdenCompra business) {
		// TODO GUARDA! no actualizar una orden si se obtuvo con el toBusiness
		// incompleto
		return null;
	}

	@Override
	protected OrdenCompra toBusiness(final OrdenCompraEntity entity) {
		final OrdenCompra business = new OrdenCompra();
		business.setId(entity.getId());
		business.setFecha(entity.getFecha());
		business.setEstado(entity.getEstado());
		for (ItemOrdenCompraEntity itemEntity : entity.getItems()) {
			final ItemOrdenCompra itemOrdenCompra = new ItemOrdenCompra();
			itemOrdenCompra.setId(itemEntity.getId());
			itemOrdenCompra.setCantidad(itemEntity.getCantidad());
			itemOrdenCompra.setRecibido(itemEntity.getRecibido());
			itemOrdenCompra.setProducto(
					getProductoDAO().get(itemEntity.getProducto().getId()));
			business.getItems().add(itemOrdenCompra);
		}
		// TODO mapear el resto...
		return business;
	}

	@Override
	public void actualizarItem(final ItemOrdenCompra itemOrdenCompra) {
		execute(new Action() {
			@Override
			public void inTransaction(final Session session)
					throws PersistenceException {
				final ItemOrdenCompraEntity entity = (ItemOrdenCompraEntity) session
						.get(ItemOrdenCompraEntity.class,
								itemOrdenCompra.getId());
				entity.setCantidad(itemOrdenCompra.getCantidad());
				entity.setRecibido(itemOrdenCompra.getRecibido());
				session.update(entity);
			}
		});
	}

}
